/**
 * Project Name:zyhj-admin
 * File Name:TYyxtO2oQyxxbServiceImpl.java
 * Package Name:com.vviton.zyhj.admin.service.impl
 * Date:2016年11月14日下午3:13:20
 *
 */

package com.vviton.zyhj.admin.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONObject;

import org.apache.commons.collections.CollectionUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.client.RestTemplate;

import com.alibaba.fastjson.JSON;
import com.vviton.zyhj.admin.content.CommonConstants;
import com.vviton.zyhj.admin.service.QyxxService;
import com.vviton.zyhj.common.base.AppConfig;
import com.vviton.zyhj.common.base.BaseService;
import com.vviton.zyhj.common.common.CodeConstants;
import com.vviton.zyhj.common.common.GlobalConstants;
import com.vviton.zyhj.common.common.ValidatorConstants;
import com.vviton.zyhj.common.dao.TYyxtHzglHzgxbMapper;
import com.vviton.zyhj.common.dao.TYyxtO2oQyxxbMapper;
import com.vviton.zyhj.common.entity.TYyxtHzglHzgxb;
import com.vviton.zyhj.common.entity.TYyxtO2oQyxxb;
import com.vviton.zyhj.common.utils.ErrorBean;
import com.vviton.zyhj.common.utils.ResultJson;
import com.vviton.zyhj.common.utils.page.Page;
import com.vviton.zyhj.common.view.Paramo2oQyxx;
import com.vviton.zyhj.common.view.ViewHzfInfo;
import com.vviton.zyhj.common.view.ViewHzfxx;
import com.vviton.zyhj.common.view.Viewo2oQyxx;
import com.wdcloud.server.tob.externalInterface.ServerProvideReadInterface;

/**
 * ClassName:TYyxtO2oQyxxbServiceImpl <br/>
 * Function: o2o企业信息service实现类. <br/>
 * Date: 2016年11月14日 下午3:13:20 <br/>
 *
 * @author libo
 * @version
 * @since JDK 1.7
 * @see
 */
public class QyxxServiceImpl extends BaseService implements QyxxService {

    /** 日志输出 */
    private static Logger logger = Logger.getLogger(QyxxServiceImpl.class);

    /** o2o企业信息DAO */
    @Autowired
    private TYyxtO2oQyxxbMapper tYyxtO2oQyxxbMapper;

    /** 合作关系DAO */
    @Autowired
    private TYyxtHzglHzgxbMapper tYyxtHzglHzgxbMapper;

    @Autowired
    private com.vviton.zyhj.admin.cors.HzfRzInfoCors hzfRzInfoCors;

    /** 业务域-伟东： 000000 */
    public static final String YWY_WD = "000000";

    /** 企业状态描述 */
    public static final String QYZT_ZC_DESC = "正常";

    /** 企业状态描述 */
    public static final String QYZT_JY_DESC = "禁用";

    /** AppConfig **/
    @Autowired
    private AppConfig appConfig;

    @Autowired
    private ServerProvideReadInterface serverProvideReadInterface;

    /**
     *
     * selectByQyid,(根据企业id获取企业信息). <br/>
     * Author: libo <br/>
     * Create Date: 2016年11月17日 <br/>
     * ===============================================================<br/>
     * Modifier: libo <br/>
     * Modify Date: 2016年11月17日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param qyid 企业id
     * @return TYyxtO2oQyxxb 企业信息
     * @since JDK 1.7
     */
    @Override
    public TYyxtO2oQyxxb selectByQyid(String qyid) {
        return tYyxtO2oQyxxbMapper.selectByPrimaryKey(qyid);
    }

    /**
     *
     * selectQyxxListByCondition,(分页查询企业信息). <br/>
     * Author: libo <br/>
     * Create Date: 2016年11月14日 <br/>
     * =============================================================== <br/>
     * Modifier: libo <br/>
     * Modify Date: 2016年11月14日 <br/>
     * Modify Description: <br/>
     * =============================================================== <br/>
     *
     * @param paramQyxx
     * @return
     * @since JDK 1.7
     */
    @Override
    public Page selectQyxxListByCondition(Paramo2oQyxx paramQyxx) {
        Page page = new Page();
        page.setCurrPage(paramQyxx.getCurrPage());
        page.setPageSize(paramQyxx.getPageSize());
        page.setParam(paramQyxx);
        List<TYyxtO2oQyxxb> resultList = tYyxtO2oQyxxbMapper.selectQyxxListByCondition(page);
        List<Viewo2oQyxx> qyxxList = new ArrayList<Viewo2oQyxx>();
        for (TYyxtO2oQyxxb qyxx : resultList) {
            Viewo2oQyxx viewQyxx = new Viewo2oQyxx();
            viewQyxx.setId(qyxx.getId());
            viewQyxx.setZzjgdm(qyxx.getZzjgdm());
            viewQyxx.setQymc(qyxx.getQymc());
            viewQyxx.setGlyzh(qyxx.getGlyzh());
            viewQyxx.setQyym(qyxx.getQyym());
            viewQyxx.setCjsj(qyxx.getCjsj());
            viewQyxx.setZt(qyxx.getZt());
            if (CodeConstants.QYZT_ZC.equals(qyxx.getZt())) {
                viewQyxx.setZtDesc(QYZT_ZC_DESC);
            }
            if (CodeConstants.QYZT_TY.equals(qyxx.getZt())) {
                viewQyxx.setZtDesc(QYZT_JY_DESC);
            }
            qyxxList.add(viewQyxx);
        }
        page.setData(qyxxList);

        int total = tYyxtO2oQyxxbMapper.countQyxxListTotal(page);
        page.setTotal(total);

        return page;
    }

    /**
     *
     * insert,(新增企业信息). <br/>
     * Author: libo <br/>
     * Create Date: 2016年11月14日 <br/>
     * =============================================================== <br/>
     * Modifier: libo <br/>
     * Modify Date: 2016年11月14日 <br/>
     * Modify Description: <br/>
     * =============================================================== <br/>
     *
     * @param record 企业信息对象
     * @return ResultJson
     * @since JDK 1.7
     */
    @Override
    public ResultJson insert(TYyxtO2oQyxxb record) {
        ResultJson result = new ResultJson(false);
        List<ErrorBean> errorList = new ArrayList<ErrorBean>();

        //组织机构代码是否重复
        int num1 = tYyxtO2oQyxxbMapper.countRepeatZzjgdmById(record.getZzjgdm(), null);
        if (num1 > 0) {
            ErrorBean errorBean = new ErrorBean();
            errorBean.setErrorData(ValidatorConstants.E10001);
            errorList.add(errorBean);
        }
        //公司名称是否重复
        int num2 = tYyxtO2oQyxxbMapper.countRepeatQymcById(record.getQymc(), null);
        if (num2 > 0) {
            ErrorBean errorBean = new ErrorBean();
            errorBean.setErrorData(ValidatorConstants.E10002);
            errorList.add(errorBean);
        }
        //公司域名是否重复
        int num3 = tYyxtO2oQyxxbMapper.countRepeatQyymById(record.getQyym(), null);
        if (num3 > 0) {
            ErrorBean errorBean = new ErrorBean();
            errorBean.setErrorData(ValidatorConstants.E10003);
            errorList.add(errorBean);
        }
        if (CollectionUtils.isNotEmpty(errorList)) {
            result.setErrorList(errorList);
            return result;
        }

        record.setId(this.getKey());

        JSONObject jsonObj1 = new JSONObject();
        jsonObj1.put("pin", CommonConstants.ZH_QYZZH);
        jsonObj1.put("password", CommonConstants.DEFAULT_PASSWORD);

        JSONObject jsonObj2 = new JSONObject();
        jsonObj2.put("pin", CommonConstants.ZH_QYGLY);
        jsonObj2.put("password", CommonConstants.DEFAULT_PASSWORD);

        List<JSONObject> jsonList = new ArrayList<JSONObject>();
        jsonList.add(jsonObj1);
        jsonList.add(jsonObj2);

        try {
            String res = postForObject(appConfig.getUrlBatchCreateUser(), jsonList.toString());
            List<Map> userList = JSON.parseArray(res, Map.class);
            if (userList.size() == 2) {
                Map qyxx = userList.get(0); // 企业信息
                Map glyxx = userList.get(1); // 管理员信息
                if (qyxx.get("result") != null && qyxx.get("result").equals("1") && glyxx.get("result") != null && glyxx.get("result").equals("1")) {
                    record.setQyzh(qyxx.get("loginid").toString());
                    record.setGlyzh(glyxx.get("loginid").toString());
                } else {
                    return result;
                }
            } else {
                return result;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return result;
        }

        //业务域 : 基础教育按照地区存储，职业教育按照大客户代码存储，伟东存储为000000
        //record.setYwy(YWY_WD);
        String glymc = record.getQymc() + CommonConstants.GLYMC;
        record.setGlymc(glymc);

        //图片地址
        //record.setLogodz("http://f.hiphotos.baidu.com//f31fbe096b63f624b6a66d358e44ebf81a4ca309.jpg");
        //record.setBdz("http://t3.baidu.com/2FW020161031338816233167.jpg&fm=30");

        record.setVersions(this.getVersion());
        record.setZt(CodeConstants.QYZT_ZC);
        record.setDelflag(GlobalConstants.DELFLAG_ADD);
        record.setCjsj(new Date());
        record.setOperatercode(record.getGlyzh());
        record.setOperatetime(record.getCjsj());
        record.setCreatercode(record.getGlyzh());
        record.setCreatertime(record.getCjsj());

        tYyxtO2oQyxxbMapper.insert(record);

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("orgcode", record.getZzjgdm());
        map.put("orgname", record.getQymc());
        map.put("type", CommonConstants.OPERATETYPE_ADD);
        map.put("loginid", record.getGlyzh());
        map.put("username", glymc);
        serverProvideReadInterface.insertOrganizationsRootServer(map);

        result.setResult(true);
        return result;
    }

    /**
     *
     * postForObject,(post请求). <br/>
     * Author: nifang <br/>
     * Create Date: 2017年2月21日 <br/>
     * ===============================================================<br/>
     * Modifier: nifang <br/>
     * Modify Date: 2017年2月21日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param url URL地址
     * @param jsonStr json格式的字符串
     * @return 请求数据
     * @since JDK 1.7
     */
    private String postForObject(String url, String jsonStr) {
        String result = null;
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
        headers.setContentType(type);
        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
        HttpEntity<String> entity = new HttpEntity<String>(jsonStr, headers);
        result = restTemplate.postForObject(url, entity, String.class);
        return result;
    }

    /**
     *
     * updateByPrimaryKey,(修改企业信息). <br/>
     * Author: libo <br/>
     * Create Date: 2016年11月14日 <br/>
     * =============================================================== <br/>
     * Modifier: libo <br/>
     * Modify Date: 2016年11月14日 <br/>
     * Modify Description: <br/>
     * =============================================================== <br/>
     *
     * @param record 参数对象
     * @return ResultJson
     * @since JDK 1.7
     */
    @Override
    public ResultJson updateByPrimaryKey(TYyxtO2oQyxxb record) {
        ResultJson result = new ResultJson(false);
        List<ErrorBean> errorList = new ArrayList<ErrorBean>();
        //组织机构代码是否重复
        int num1 = tYyxtO2oQyxxbMapper.countRepeatZzjgdmById(record.getZzjgdm(), record.getId());
        if (num1 > 0) {
            ErrorBean errorBean = new ErrorBean();
            errorBean.setErrorData(ValidatorConstants.E10001);
            errorList.add(errorBean);
        }
        //公司名称是否重复
        int num2 = tYyxtO2oQyxxbMapper.countRepeatQymcById(record.getQymc(), record.getId());
        if (num2 > 0) {
            ErrorBean errorBean = new ErrorBean();
            errorBean.setErrorData(ValidatorConstants.E10002);
            errorList.add(errorBean);
        }
        //公司域名是否重复
        int num3 = tYyxtO2oQyxxbMapper.countRepeatQyymById(record.getQyym(), record.getId());
        if (num3 > 0) {
            ErrorBean errorBean = new ErrorBean();
            errorBean.setErrorData(ValidatorConstants.E10003);
            errorList.add(errorBean);
        }
        if (CollectionUtils.isNotEmpty(errorList)) {
            result.setErrorList(errorList);
            return result;
        }
        record.setVersions(this.getVersion());
        record.setDelflag(GlobalConstants.DELFLAG_UPDATE);
        record.setOperatercode(record.getGlyzh());
        record.setOperatetime(new Date());

        int count = tYyxtO2oQyxxbMapper.updateByPrimaryKey(record);
        if (count == 1) {
            result.setResult(true);
        }
        return result;
    }

    /**
     *
     * disableQyxxByKey,(根据ID禁用该企业所有信息). <br/>
     * Author: libo <br/>
     * Create Date: 2016年11月14日 <br/>
     * ===============================================================<br/>
     * Modifier: libo <br/>
     * Modify Date: 2016年11月14日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param qyid 企业ID
     * @param zzjgdm 组织机构代码
     * @param yhzh 用户账号
     * @return ResultJson
     * @since JDK 1.7
     */
    @Override
    public ResultJson disableQyxxByKey(String qyid, String zzjgdm, String yhzh) {
        ResultJson result = new ResultJson(false);
        TYyxtO2oQyxxb record = new TYyxtO2oQyxxb();
        record.setId(qyid);
        record.setZt(CodeConstants.QYZT_TY);
        record.setDelflag(GlobalConstants.DELFLAG_UPDATE);
        record.setVersions(this.getVersion());
        record.setOperatercode(yhzh);
        record.setOperatetime(new Date());
        int count = tYyxtO2oQyxxbMapper.disableOrRecoverQyxxByKey(record);
        if (count == 1) {
            result.setResult(true);
        }
        return result;
    }

    /**
     *
     * recoverQyxxByKey,(根据ID恢复此企业). <br/>
     * Author: libo <br/>
     * Create Date: 2016年11月14日 <br/>
     * ===============================================================<br/>
     * Modifier: libo <br/>
     * Modify Date: 2016年11月14日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param qyid 企业ID
     * @param zzjgdm 组织机构代码
     * @param yhzh 用户账号
     * @return ResultJson
     * @since JDK 1.7
     */
    @Override
    public ResultJson recoverQyxxByKey(String qyid, String zzjgdm, String yhzh) {
        ResultJson result = new ResultJson(false);
        TYyxtO2oQyxxb record = new TYyxtO2oQyxxb();
        record.setId(qyid);
        record.setZt(CodeConstants.QYZT_ZC);
        record.setDelflag(GlobalConstants.DELFLAG_UPDATE);
        record.setVersions(this.getVersion());
        record.setOperatercode(yhzh);
        record.setOperatetime(new Date());
        int count = tYyxtO2oQyxxbMapper.disableOrRecoverQyxxByKey(record);
        if (count == 1) {
            result.setResult(true);
        }
        return result;
    }

    /**
     *
     * resetAdminPwd,(重置超级管理员密码). <br/>
     * Author: libo <br/>
     * Create Date: 2016年11月15日 <br/>
     * ===============================================================<br/>
     * Modifier: libo <br/>
     * Modify Date: 2016年11月15日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param glyzh 管理员账号
     * @param newPwd 新密码
     * @return ResultJson
     * @since JDK 1.7
     */
    @Override
    public ResultJson resetAdminPwd(String glyzh, String newPwd) {

        ResultJson result = new ResultJson(false);

        JSONObject jsonObj = new JSONObject();
        jsonObj.put("loginid", glyzh);
        jsonObj.put("newpassword", newPwd);
        jsonObj.put("passwordstrengthcheck", CommonConstants.PASSWORDSTRENGTHCHECK_NO);
        try {
            String res = postForObject(appConfig.getUrlResetPwd(), jsonObj.toString());
            Map map = JSON.parseObject(res, Map.class);
            if (map.get("result") != null && map.get("result").equals("1")) {
                result.setResult(true);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return result;
        }
        return result;
    }

    /**
     *
     * isHzfrzAndxyqd,(查询合作方是否入驻和协议签订判断). <br/>
     * Author: libo <br/>
     * Create Date: 2017年3月24日 <br/>
     * ===============================================================<br/>
     * Modifier: libo <br/>
     * Modify Date: 2017年3月24日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param loginid 登录人id(zh)
     * @param cmsorgcode 组织机构代码
     * @return ViewHzfxx 合作方信息
     * @since JDK 1.7
     */
    @Override
    public ViewHzfxx isHzfrzAndxyqd(String loginid, String cmsorgcode) {
        ViewHzfxx hzfxx = new ViewHzfxx();
        //根据合作方账号zh和业务域ywy获取合作协议签署信息
        TYyxtHzglHzgxb hzxx = tYyxtHzglHzgxbMapper.getHzgxbXyzt(loginid, cmsorgcode);
        if (hzxx != null) {
            // 获取合作方入驻信息
            //resful方式
            ViewHzfInfo hzfInfo = CommonConstants.getHzfInfo(hzxx.getHzfid());
            if (hzfInfo != null) {
                // 合作方已经入驻 且 已签署协议
                if (CommonConstants.HZF_XYYES_RZYES.equals(hzxx.getXyzt()) && CommonConstants.HZF_XYYES_RZYES.equals(hzxx.getSpjg())) {
                    hzfxx.setFlag(CommonConstants.HZF_XYYES_RZYES);
                    hzfxx.setHzfid(hzfInfo.getHzfid());
                    hzfxx.setHzfmc(hzfInfo.getHzfmc());
                    hzfxx.setZzh(hzfInfo.getHzfzh());
                } else {// 合作方入驻且未签署协议
                    hzfxx.setFlag(CommonConstants.HZF_XYNO_RZYES);
                }
            } else {// 合作方未入驻且未签署协议
                hzfxx.setFlag(CommonConstants.HZF_XYNO_RZNO);
            }
        } else {
            hzfxx.setFlag(CommonConstants.HZF_XYNO_RZNO);
        }
        return hzfxx;
    }

    /**
     *
     * HzfxxListByCmsorgcode,(根据组织机构代码集合获取所有的企业信息). <br/>
     * Author: libo <br/>
     * Create Date: 2017年3月24日 <br/>
     * ===============================================================<br/>
     * Modifier: libo <br/>
     * Modify Date: 2017年3月24日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     *
     * @param cmsorgcodes 组织机构代码集合对象
     * @return List<ViewHzfxx> 合作方企业信息列表
     * @since JDK 1.7
     */
    @Override
    public List<ViewHzfxx> HzfxxListByCmsorgcode(String cmsorgcode) {
        //已签署协议 且 审核通过合作方企业列表
        List<TYyxtHzglHzgxb> hzfList = tYyxtHzglHzgxbMapper.getHzgxbxxByZzjgcode(cmsorgcode);
        List<ViewHzfxx> hzfxxList = new ArrayList<ViewHzfxx>();
        if (CollectionUtils.isNotEmpty(hzfxxList)) {
            for (TYyxtHzglHzgxb hzf : hzfList) {
                //获取合作方入驻信息
                //resful方式
                ViewHzfInfo hzfInfo = CommonConstants.getHzfInfo(hzf.getHzfid());
                if (hzfInfo != null) {
                    ViewHzfxx hzfxx = new ViewHzfxx();
                    hzfxx.setHzfid(hzfInfo.getHzfid());
                    hzfxx.setHzfmc(hzfInfo.getHzfmc());
                    hzfxxList.add(hzfxx);
                }
            }
        }
        return hzfxxList;
    }

}
